package com.hopu.haogoumall.core.aliyunoss;

import com.aliyun.oss.OSS;
import com.aliyun.oss.internal.OSSHeaders;
import com.aliyun.oss.model.CannedAccessControlList;
import com.aliyun.oss.model.ObjectMetadata;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.StorageClass;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.io.InputStream;

/**
 * @Package: com.hopu.haogoumall.core.aliyunoss
 * @ClassName: AliyunOSSUtils
 * @Author: xiaoBao
 * @CreateTime: 2020-11-30 15:36
 * @Description: 【对象存储OSS工具类】包含创建存储空间，上传、下载文件的方法
 */
@Component  /** @Component注解：标注该类为Spring容器管理的Bean对象*/
public class AliyunOSSUtils {
    /**
     * Bucket 地域节点
     */
    @Value("${aliyun.oss.endpoint}")
    private String endpoint;

    /**
     * bucket名称
     */
    private String bucketName = "haogou-mall";

    /**自动引入 OSS对象（前提是OSS对象的生命周期已经交给Spring容器才能正确引入并使用）*/
    @Autowired
    private OSS ossClient;


    /**
     * 【上传文件】
     * @param objectName  需要保存的Bucket（资源仓库）中的具体路径和文件名  命名规则：保存路径/username.文件后缀;
     * @param inputStream 上传文件的IO流;
     * @return 将上传的文件全路径URL（包括域名+路径名+文件名）返回给方法；
     *          用于在业务层调用上传文件方法时，得到URL插入数据库中。
     */
    public String uploadFile(String objectName, InputStream inputStream){
        /** PutObjectRequest对象：上传文件的请求 传递三个参数：Bucket的名字、保持路径+后缀名的路径名、文件的IO流*/
        PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName,objectName,inputStream);

        /** 配置 文件的访问权限*/
        /** 如果需要上传时设置存储类型与访问权限，请参考以下示例代码。*/
        ObjectMetadata metadata = new ObjectMetadata(); //元数据
        /** 配置 文件的存储类型（默认Standard标准存储）*/
        /*metadata.setHeader(OSSHeaders.OSS_STORAGE_CLASS, StorageClass.Standard.toString());*/
        /** 配置 文件的读取权限*/
        metadata.setObjectAcl(CannedAccessControlList.PublicRead);  //公共读
        putObjectRequest.setMetadata(metadata); //让请求携带 元数据(metadata)

        /** 执行 上传文件操作*/
        ossClient.putObject(putObjectRequest);

        // https://haogou-mall.oss-cn-guangzhou.aliyuncs.com/images/userAvatar/username.suffix
        String url = "https://"+bucketName+"."+endpoint.replace("https://","")+"/"+objectName;
        /** 将url返回给方法*/
        return url;
    }
}
